//JDBCAutomovelDAO.java
//Classe dao do Automovel para JDBC
package dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import modelo.Automovel;
import modelo.Motorista;

/**
 * @author Diego Heusser
 * @author Eder Schramm
 */
public class JDBCAutomovelDAO extends JDBCDAO implements AutomovelDAO {

    @Override
    public boolean inserir(Automovel umAutomovel) {
        try {
            String insereSQL = "INSERT INTO Automovel(id,ano,combustivel,cor, "
                    + "fabricante, modelo, motoristaid) VALUES(?,?,?,?,?,?,?)";
            insere(insereSQL, umAutomovel.getId(), umAutomovel.getAno(),
                    umAutomovel.getCombustivel(), umAutomovel.getCor(),
                    umAutomovel.getFabricante(), umAutomovel.getModelo(),
                    umAutomovel.getUmMotorista().getId());
            return true;
        } catch (SQLException e) {
            return false;
        }
    }

    @Override
    public boolean alterar(Automovel umAutomovel) {
        try {
            String alteraSQL = "UPDATE Automovel SET ano = ?, combustivel = ?, "
                    + "cor = ?, fabricante = ?, modelo = ?, motoristaid = ? "
                    + "WHERE id = ?";
            altera(alteraSQL, umAutomovel.getId(), umAutomovel.getAno(),
                    umAutomovel.getCombustivel(), umAutomovel.getCor(),
                    umAutomovel.getFabricante(), umAutomovel.getModelo(),
                    umAutomovel.getUmMotorista().getId());
            return true;
        } catch (SQLException e) {
            return false;
        }
    }

    @Override
    public boolean remover(int id) {
        try {
            String removeSQL = "DELETE FROM Automovel WHERE id = ?";
            remove(removeSQL, id);
            return true;
        } catch (SQLException e) {
            return false;
        }
    }

    @Override
    public List<Automovel> listar() {
        try {
            List<Automovel> lista = new ArrayList<>();
            String select = "SELECT * FROM Automovel";
            Statement stmt = getConexao().createStatement();
            ResultSet rs = stmt.executeQuery(select);

            while (rs.next()) {
                modelo.Automovel umAutomovel = new Automovel();
                umAutomovel.setAno(rs.getInt("ano"));
                umAutomovel.setCombustivel(rs.getString("combustivel"));
                umAutomovel.setCor(rs.getString("cor"));
                umAutomovel.setFabricante(rs.getString("fabricante"));
                umAutomovel.setId(rs.getInt("id"));
                umAutomovel.setModelo(rs.getString("modelo"));
                umAutomovel.setUmMotorista(new dao.JDBCMotoristaDAO().
                        listar(rs.getInt("motoristaId")));
                lista.add(umAutomovel);
            }
            return lista;
        } catch (SQLException e) {
            return null;
        }
    }

    @Override
    public List<Automovel> listarFisico() {
        throw new UnsupportedOperationException("Não é possível listar físico com JDBC.");
    }

    @Override
    public List<Automovel> listar(String motorista) {
        try {
            List<Motorista> motoristas = new dao.JDBCMotoristaDAO().listar(motorista);
            List<Automovel> lista = new ArrayList<>();
            for (Motorista umMotorista : motoristas) {
                String select = "SELECT * FROM Automovel WHERE motoristaId = " + umMotorista.getId() + " ";
                Statement stmt = getConexao().createStatement();
                ResultSet rs = stmt.executeQuery(select);

                while (rs.next()) {
                    modelo.Automovel umAutomovel = new Automovel();
                    umAutomovel.setAno(rs.getInt("ano"));
                    umAutomovel.setCombustivel(rs.getString("combustivel"));
                    umAutomovel.setCor(rs.getString("cor"));
                    umAutomovel.setFabricante(rs.getString("fabricante"));
                    umAutomovel.setId(rs.getInt("id"));
                    umAutomovel.setModelo(rs.getString("modelo"));
                    umAutomovel.setUmMotorista(umMotorista);

                    lista.add(umAutomovel);
                }
            }
            return lista;
        } catch (SQLException e) {
            return null;
        }
    }

    @Override
    public boolean idValido(int id) {
        try {
            String select = "SELECT * FROM Automovel WHERE id = " + id + "";
            Statement stmt = getConexao().createStatement();
            ResultSet rs = stmt.executeQuery(select);
            return !rs.next();
        } catch (SQLException e) {
            return false;
        }
    }

    @Override
    public boolean apagarDados() {
        try {
            String select = "DELETE FROM Automovel";
            Statement stmt = getConexao().createStatement();
            stmt.executeQuery(select);
            return true;
        } catch (Exception ex) {
            return false;
        }
    }

    @Override
    public boolean criarTabela() throws Exception {
        String ddl = "CREATE TABLE Automovel ("
                + "	id INT CONSTRAINT nn_Automovel_id NOT NULL,"
                + "	cor VARCHAR(30) CONSTRAINT nn_Automovel_cor NOT NULL,"
                + "	ano INT CONSTRAINT  nn_Automovel_ano NOT NULL,"
                + "	fabricante VARCHAR(50) CONSTRAINT nn_Automovel_fabricante NOT NULL,"
                + "	modelo VARCHAR(50) CONSTRAINT nn_Automovel_modelo NOT NULL,"
                + "	combustivel VARCHAR(30) CONSTRAINT nn_Automovel_combustivel NOT NULL,"
                + "	motoristaId INT CONSTRAINT nn_Automovel_motoristaId NOT NULL,"
                + "	CONSTRAINT pk_Automovel PRIMARY KEY(id),"
                + "	CONSTRAINT fk_Automovel_Motorista FOREIGN KEY (motoristaId) REFERENCES Motorista"
                + ")";
        Statement stmt = getConexao().createStatement();
        stmt.execute(ddl);

        String[] comentarios = new String[8];
        comentarios[0] = "COMMENT ON TABLE Automovel IS 'Tabela para guadar os dados do automóvel'";
        comentarios[1] = "COMMENT ON COLUMN Automovel.id IS 'Campo chave da tabela Automovel'";
        comentarios[2] = "COMMENT ON COLUMN Automovel.cor IS 'Campo para guadar a cor do automóvel'";
        comentarios[3] = "COMMENT ON COLUMN Automovel.ano IS 'Campo para guadar o ano do automóvel'";
        comentarios[4] = "COMMENT ON COLUMN Automovel.fabricante IS 'Campo para guadar o fabricante do automóvel'";
        comentarios[5] = "COMMENT ON COLUMN Automovel.modelo IS 'Campo para guadar o modelo do automóvel'";
        comentarios[6] = "COMMENT ON COLUMN Automovel.combustivel IS 'Campo para guadar o tipo do comobustível do automóvel'";
        comentarios[7] = "COMMENT ON COLUMN Automovel.motoristaId IS 'Chave estrangeira que referência a tabela motorista'";
        for (int i = 0; i < comentarios.length; i++) {
            stmt.execute(comentarios[i]);
        }
        stmt.close();
        return true;
    }

}
